package com.ll.listdemo;

import java.util.LinkedList;

/**
 * @author 刘龙
 * @version 1.0
 */
public class LinkedListDemo01 {
    public static void main(String[] args) {
        // 模拟一个简单的双向链表
        Node jack = new Node("jack");
        Node tom = new Node("tom");
        Node ll = new Node("ll");

        // 连接三个节点, 形成双向链表
        // jack => tom => ll
        jack.next = tom;
        tom.next = ll;

        // ll => tom => jack
        ll.prev = tom;
        tom.prev = jack;

        // 让first引用指向jack,也就是双向链表的首节点
        Node first = jack;

        // 让last引用指向ll,也就是双向链表的尾结点
        Node last = ll;

        // 演示从头到尾进行遍历
        while (true) {
            if (first == null) {
                break;
            }

            //输出first信息
            System.out.println(first);
            first = first.next;
        }

        System.out.println("=========");

        // 从尾到头遍历
        while (true) {
            if (last == null) {
                break;
            }

            // 输出end信息
            System.out.println(last);
            last = last.prev;
        }

        System.out.println("=========");

        // 演示链表添加对象/数据,是多么快速方便
        // 要求在 tom和ll之间,插入一个对象java

        // 1.创建对象
        Node java = new Node("java");

        // jack => tom => ll
        java.prev = tom;
        java.next = ll;

        ll.prev = java;
        tom.next = java;

        // 让first引用指向jack,也就是双向链表的首节点
        first = jack;

        // 演示从头到尾进行遍历
        while (true) {
            if (first == null) {
                break;
            }

            //输出first信息
            System.out.println(first);
            first = first.next;
        }
    }
}

// 定义一个Node类, Node对象表示双向链表的一个节点
class Node {
    /**
     * 真正存放数据
     */
    public Object item;

    /**
     * 指向下一个节点
     */
    public Node next;

    /**
     * 指向上一个节点
     */
    public Node prev;

    public Node(Object item) {
        this.item = item;
    }

    @Override
    public String toString() {
        return "Node name = " + item;
    }
}